系統上線以前,如果我們沒有去挑戰一個系統的極限,我們永遠不知道該系統最高可以有多少的可靠度,壓力測試就是因此而生(Stress testing)。最常見的就是Jmeter,一款由Apache開源的JAVA壓力測試工具。
Jmeter能做到的事情包含:
更重要的是,Jmeter在完成測試後可以產生完整動態的HTML報告,方便使用者觀看。 接下來就來講一下Jmeter的安裝與使用。今天也會介紹一下如何將Jmeter Dockerize,明天會介紹如何將Jmeter整合進Jenkins。
以下用Windows版講解:
下載完成後解壓縮,獲得了一包apache-jmeter-X.X.X
,cmd 執行該包下的apache-jmeter-X.X.X/bin/jmeter.bat
。可以獲得一個Jmeter畫面:
接下來我們要建立Jmeter的腳本,假如測試目標是Express的一個GET API,localhost:3000/hello
,呼叫後會回傳Hello World,我們要來看看系統最高能承受多少的壓力。以及localhost:3000/postParams
,測試呼叫的參數是否符合要求。
router.get("/hello",function(req,res,next){
res.send("<h1>Hello World</h1>")
})
router.post("/postParams",function(req,res){
const params = req.body.number;
if(params < 1000) res.send("That's Good Number") //回傳200
else res.status(404).send("I don't like this Number") //回傳404
})
進入Jmeter GUI後在測試計畫(Test Plan)上點擊右鍵 > Add > Threads(Users) > Thread Group
。每一個Threads就是在模擬每一個人的行為。
在Thread Properities中,Number of Threads代表同時模擬的用戶數,Loop Count代表共幾輪。可以暫時調成1000人與3輪。接著對著Thread Group按右鍵 > Add > Sampler > Http Reqester
在Http Request中輸入這次Test名稱、Server Name、路徑。localhost:3000/hello
如下:
多建立幾個Http Request任務後我們就能開始執行測試了。對著Thread Group 右鍵 > Add > Listener > ...
,可以選擇各式各樣的結果圖,這裡選擇Summary Report。 按下save保存你的測試參數為一個.jmx檔,接下來按下三角型進行測試。
注: 要是按下save報錯
打開 Options > Look and Feel > 選擇一個非Darcula的外觀 > 重新啟動
即可解決。
Summary Report可以很清楚的看到測試結果:
如上面的API,他只接受1000以下的數字,我們可以來建立一個Sequencial的數字與Random的數字來進行測試。
Random數與Post
該如何建立Random數,可以參考Jmeter function,同樣的接著對著Thread Group按右鍵 > Add > Sampler > Http Reqester
,這次選擇POST
,底下選擇Body Data,輸入:
// Body Data
{
"number": ${__Random(0,2000)}
}
但是這樣還不夠,Post的data不是JSON格式,對著HTTP Request右鍵 > Config Element > HTTP Header Manager
,新增一個格式為content-type:application/json
Sequence 數
該如何建立Sequence數,讓我們從0~1000每個數字測試一遍呢? Jmeter沒有給這個Function,但是還是能辦到。對著Thread Group右鍵 > Add > Logic Controller > Loop Controller
Loop Controller內有一個Loop Count,這代表執行幾次Loop。比如說Thread Group的Threads為1000、Thread Group的Loop Count為2、Loop Controller的Loop Count為2,則Loop總共執行次數是: 1000*2*2
共4000次。
接著對著Loop Controller右鍵 > Add > Config Element > Counter
Counter可以設定你的Start Number與Increment,最重要的定義你的Export Variable Name
,這裡我定義成counter_value
。
再次建立好你的HTTP Request (在Loop Countroller之下),記得調整你的HTTP Header,然後在Body Data輸入:
// Body Data
{
"number": ${counter_value}
}
接著就能套用運行順序類的參數了。